if (win_y)
*win_y = wy;
+ if (get_toplevel)
+ {
+ GdkWindowObject *w = (GdkWindowObject *)retval;
+ /* Requested toplevel, find it. */
+ /* TODO: This can be implemented more efficient by never
+ recursing into children in the first place */
+ if (w)
+ {
+ /* Convert to toplevel */
+ while (w->parent != NULL &&
+ w->parent->window_type != GDK_WINDOW_ROOT)
+ {
+ *win_x += w->x;
+ *win_y += w->y;
+ w = w->parent;
+ }
+ retval = (GdkWindow *)w;
+ }
+ }
+
return retval;
}
GdkWindow *window;
gint x, y;
- window = _gdk_windowing_window_at_pointer (display, &x, &y, NULL);
+ window = _gdk_windowing_window_at_pointer (display, &x, &y, NULL, FALSE);
/* This might need corrections, as the native window returned
may contain client side children */
GdkModifierType *state_out)
{
GdkWindow *pointer_window;
- GdkWindowObject *w;
int x, y;
GdkModifierType state;
- pointer_window = _gdk_windowing_window_at_pointer (display, &x, &y, &state);
+ pointer_window = _gdk_windowing_window_at_pointer (display, &x, &y, &state, TRUE);
if (pointer_window != NULL &&
(GDK_WINDOW_DESTROYED (pointer_window) ||
GDK_WINDOW_TYPE (pointer_window) == GDK_WINDOW_ROOT ||
GDK_WINDOW_TYPE (pointer_window) == GDK_WINDOW_FOREIGN))
pointer_window = NULL;
- w = (GdkWindowObject *)pointer_window;
- if (w)
- {
- /* Convert to toplevel */
- while (w->parent != NULL &&
- w->parent->window_type != GDK_WINDOW_ROOT)
- {
- x += w->x;
- y += w->y;
- w = w->parent;
- }
- }
-
*x_out = x;
*y_out = y;
*state_out = state;
- return (GdkWindow *)w;
+ return pointer_window;
}
static void
GdkWindow* _gdk_windowing_window_at_pointer (GdkDisplay *display,
gint *win_x,
gint *win_y,
- GdkModifierType *mask);
+ GdkModifierType *mask,
+ gboolean get_toplevel);
GdkGrabStatus _gdk_windowing_pointer_grab (GdkWindow *window,
GdkWindow *native,
gboolean owner_events,
_gdk_windowing_window_at_pointer (GdkDisplay *display,
gint *win_x,
gint *win_y,
- GdkModifierType *mask)
+ GdkModifierType *mask,
+ gboolean get_toplevel)
{
GdkWindow *found_window;
gint x, y;
if (mask)
*mask = tmp_mask;
+ if (get_toplevel)
+ {
+ GdkWindowObject *w = (GdkWindowObject *)found_window;
+ /* Requested toplevel, find it. */
+ /* TODO: This can be implemented more efficient by never
+ recursing into children in the first place */
+ if (w)
+ {
+ /* Convert to toplevel */
+ while (w->parent != NULL &&
+ w->parent->window_type != GDK_WINDOW_ROOT)
+ {
+ *win_x += w->x;
+ *win_y += w->y;
+ w = w->parent;
+ }
+ found_window = (GdkWindow *)w;
+ }
+ }
+
return found_window;
}
_gdk_windowing_window_at_pointer (GdkDisplay *display,
gint *win_x,
gint *win_y,
- GdkModifierType *mask)
+ GdkModifierType *mask,
+ gboolean get_toplevel)
{
GdkWindow *window;
POINT point, pointc;
ScreenToClient (hwnd, &point);
do {
+ if (get_toplevel &&
+ (window = gdk_win32_handle_table_lookup ((GdkNativeWindow) hwnd)) != NULL &&
+ GDK_WINDOW_TYPE (window) != GDK_WINDOW_FOREIGN)
+ break;
+
hwndc = ChildWindowFromPoint (hwnd, point);
ClientToScreen (hwnd, &point);
ScreenToClient (hwndc, &point);
_gdk_windowing_window_at_pointer (GdkDisplay *display,
gint *win_x,
gint *win_y,
- GdkModifierType *mask)
+ GdkModifierType *mask,
+ gboolean get_toplevel)
{
GdkWindow *window;
GdkScreen *screen;
while (xwindow)
{
xwindow_last = xwindow;
+ if (get_toplevel &&
+ (window = gdk_window_lookup_for_display (display, xwindow)) != NULL &&
+ GDK_WINDOW_TYPE (window) != GDK_WINDOW_FOREIGN)
+ break;
XQueryPointer (xdisplay, xwindow,
&root, &xwindow, &rootx, &rooty, &winx, &winy, &xmask);
}
while (xwindow)
{
xwindow_last = xwindow;
+ if (get_toplevel &&
+ (window = gdk_window_lookup_for_display (display, xwindow)) != NULL &&
+ GDK_WINDOW_TYPE (window) != GDK_WINDOW_FOREIGN)
+ break;
gdk_error_trap_push ();
XQueryPointer (xdisplay, xwindow,
&root, &xwindow, &rootx, &rooty, &winx, &winy, &xmask);